/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.controlador.recepcion;

import com.ec.medical.controlador.ControladorBase;
import com.ec.medical.entidades.DivisionGeografica;
import com.ec.medical.entidades.Prestador;
import com.ec.medical.exepciones.PrestadorException;
import com.ec.medical.managers.recepcion.IngresoMedicoDataManager;
import com.ec.medical.servicio.DivisionGeograficaServicioLocal;
import com.ec.medical.servicio.EspecialidadServicioLocal;
import com.ec.medical.servicio.PrestadorServicioLocal;
import com.ec.medical.util.Utilitarios;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@ManagedBean
@RequestScoped
public class IngresoMedicoControlador extends ControladorBase {

    private Logger LOG = Logger.getLogger(IngresoMedicoControlador.class.getName());
    @ManagedProperty(value = "#{ingresoMedicoDataManager}")
    private IngresoMedicoDataManager ingresoMedicoDataManager;
    @EJB
    private DivisionGeograficaServicioLocal divisionGeograficaServicio;
    @EJB
    private PrestadorServicioLocal prestadorServicio;
    @EJB
    private EspecialidadServicioLocal especialidadServicio;
    private String mensajeError;

    /**
     * Creates a new instance of IngresoMedicoControlador
     */
    public IngresoMedicoControlador() {
    }

    @Override
    protected void imprimirLogInfo(String mensaje) {
        LOG.info(mensaje);
    }

    @Override
    protected void imprimirLogError(String mensaje) {
        LOG.error(mensaje);
    }

    @Override
    public void iniciarDatos() {
        imprimirLogInfo("iniciar datos");
    }

    public IngresoMedicoDataManager getIngresoMedicoDataManager() {
        return ingresoMedicoDataManager;
    }

    public void setIngresoMedicoDataManager(IngresoMedicoDataManager ingresoMedicoDataManager) {
        this.ingresoMedicoDataManager = ingresoMedicoDataManager;
    }

    /**
     * selecciona la division geografica de primer nivel
     */
    public void seleccionarDivisionNivelUno() {
        getIngresoMedicoDataManager().setDivisionGeograficaNivelDos(null);
        getIngresoMedicoDataManager().setDivisionGeograficaNivelTres(null);
    }
    
    public List<SelectItem> getEspecialidad() {
        return generarItemsConValorNulo(especialidadServicio.obtenerTodos());
    }

    public List<SelectItem> getDivisionGeograficaNivelUno() {
        return generarItemsConValorNulo(divisionGeograficaServicio.obtenerPorPadre(sesionDataManager.getDivisionGeografica().getCodigoDivisionGeografica()));
    }

    public List<SelectItem> getDivisionGeograficaNivelDos() {

        if (!Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelUno()) && !Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelUno().getCodigoDivisionGeografica())) {
            return generarItemsConValorNulo(divisionGeograficaServicio.obtenerPorPadre(getIngresoMedicoDataManager().getDivisionGeograficaNivelUno().getCodigoDivisionGeografica()));
        }

        return null;
    }

    public List<SelectItem> getDivisionGeograficaNivelTres() {

        if (!Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelDos()) && !Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelDos().getCodigoDivisionGeografica())) {
            return generarItemsConValorNulo(divisionGeograficaServicio.obtenerPorPadre(getIngresoMedicoDataManager().getDivisionGeograficaNivelDos().getCodigoDivisionGeografica()));
        }

        return null;
    }

    /**
     * seleccion la division geografica de tercer nivel
     */
    public void seleccionarDivisionNivelTres() {
        if (!Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelTres())) {
            getIngresoMedicoDataManager().setDivisionGeograficaNivelTres(divisionGeograficaServicio.obtenerPorCodigo(getIngresoMedicoDataManager().getDivisionGeograficaNivelTres()));
        } else {
            getIngresoMedicoDataManager().setDivisionGeograficaNivelTres(null);
        }
    }

    /**
     * Crea un nuevo medico
     */
    public void crearMedico() {
        if (validarDatosParaCreacionEdicionDelPrestador()) {
            Prestador prestador = getIngresoMedicoDataManager().getPrestador();
            DivisionGeografica divGeografica = getIngresoMedicoDataManager().getDivisionGeograficaNivelTres();
            prestador.setDivisionGeografica(divGeografica);
            try {
                prestadorServicio.ingresarNuevoPrestador(prestador);
                getIngresoMedicoDataManager().limpiarValores();
                infoMessage("Medico creado correctamente");
            } catch (PrestadorException e) {
                errorMessage(e.getMessage());
            }
        } else {
            errorMessage(mensajeError);
        }

    }

    /*
     * Medoto que valida si la division geografica y las mascotas se encuentran correctamente anadidas
     */
    private boolean validarDatosParaCreacionEdicionDelPrestador() {
        if (Utilitarios.esNulo(getIngresoMedicoDataManager().getDivisionGeograficaNivelTres())) {
            mensajeError = "Division Geografica Obligatoria";
            return false;
        }
        return true;
    }

    /**
     * Editar el prestador y sus horarios de atencion
     */
    public void editarMedico() {
        if (validarDatosParaCreacionEdicionDelPrestador()) {
            Prestador prestador = getIngresoMedicoDataManager().getPrestador();
            DivisionGeografica divGeografica = getIngresoMedicoDataManager().getDivisionGeograficaNivelTres();
            prestador.setDivisionGeografica(divGeografica);
            try {
                prestadorServicio.editarPrestador(prestador);
                infoMessage("Medico editado correctamente");
            } catch (PrestadorException ex) {
                errorMessage("Error al editar Medico");
            }

        } else {
            errorMessage(mensajeError);
        }
    }
}
